home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / LITTLE / P3SRC.ZIP / ATARI / PIGMENT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-18  |  18.1 KB  |  686 lines

  1. /****************************************************************************
  2. *                pigment.c
  3. *
  4. *  This module implements solid texturing functions that modify the color
  5. *  transparency of an object's surface.
  6. *
  7. *  from Persistence of Vision(tm) Ray Tracer
  8. *  Copyright 1996 Persistence of Vision Team
  9. *---------------------------------------------------------------------------
  10. *  NOTICE: This source code file is provided so that users may experiment
  11. *  with enhancements to POV-Ray and to port the software to platforms other 
  12. *  than those supported by the POV-Ray Team.  There are strict rules under
  13. *  which you are permitted to use this file.  The rules are in the file
  14. *  named POVLEGAL.DOC which should be distributed with this file. If 
  15. *  POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  16. *  Team Coordinator by leaving a message in CompuServe's Graphics Developer's
  17. *  Forum.  The latest version of POV-Ray may be found there as well.
  18. *
  19. * This program is based on the popular DKB raytracer version 2.12.
  20. * DKBTrace was originally written by David K. Buck.
  21. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  22. *
  23. *****************************************************************************/
  24.  
  25. /*
  26.    Some texture ideas garnered from SIGGRAPH '85 Volume 19 Number 3, 
  27.    "An Image Synthesizer" By Ken Perlin.
  28.    Further Ideas Garnered from "The RenderMan Companion" (Addison Wesley).
  29. */
  30.  
  31. #include "frame.h"
  32. #include "vector.h"
  33. #include "povproto.h"
  34. #include "texture.h"
  35. #include "colour.h"   
  36. #include "image.h"    
  37. #include "matrices.h" 
  38. #include "pigment.h"  
  39. #include "txttest.h"
  40.                     
  41.  
  42. /*****************************************************************************
  43. * Local preprocessor defines
  44. ******************************************************************************/
  45.  
  46.  
  47.  
  48. /*****************************************************************************
  49. * Local typedefs
  50. ******************************************************************************/
  51.  
  52.  
  53.  
  54. /*****************************************************************************
  55. * Local variables
  56. ******************************************************************************/
  57.  
  58. static BLEND_MAP_ENTRY Black_White_Entries[2] /* =
  59.   {{0.0, FALSE, {{0.0, 0.0, 0.0, 0.0, 0.0}}},
  60.   {1.0, FALSE, {{1.0, 1.0, 1.0, 0.0, 0.0}}}} */ ;
  61.  
  62. static BLEND_MAP Gray_Default_Map =
  63.   { 2,  FALSE, COLOUR_TYPE,  -1,  Black_White_Entries};
  64.  
  65. static BLEND_MAP_ENTRY Bozo_Entries[6] /* =
  66.   {{0.4, FALSE, {{1.0, 1.0, 1.0, 0.0, 0.0}}},
  67.    {0.4, FALSE, {{0.0, 1.0, 0.0, 0.0, 0.0}}},
  68.    {0.6, FALSE, {{0.0, 1.0, 0.0, 0.0, 0.0}}},
  69.    {0.6, FALSE, {{0.0, 0.0, 1.0, 0.0, 0.0}}},
  70.    {0.8, FALSE, {{0.0, 0.0, 1.0, 0.0, 0.0}}},
  71.    {0.8, FALSE, {{1.0, 0.0, 0.0, 0.0, 0.0}}}} */ ;
  72.  
  73. static BLEND_MAP Bozo_Default_Map =
  74.   { 6,  FALSE, COLOUR_TYPE,  -1,  Bozo_Entries};
  75.  
  76. static BLEND_MAP_ENTRY Wood_Entries[2] /* =
  77.   {{0.6, FALSE, {{0.666, 0.312,  0.2,   0.0, 0.0}}},
  78.    {0.6, FALSE, {{0.4,   0.1333, 0.066, 0.0, 0.0}}}} */ ;
  79.     
  80. static BLEND_MAP Wood_Default_Map =
  81.   { 2,  FALSE, COLOUR_TYPE,  -1,  Wood_Entries};
  82.  
  83. static BLEND_MAP_ENTRY Mandel_Entries[5] /* =
  84.   {{0.001, FALSE, {{0.0, 0.0, 0.0, 0.0, 0.0}}},
  85.    {0.001, FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}},
  86.    {0.012, FALSE, {{1.0, 1.0, 0.0, 0.0, 0.0}}},
  87.    {0.015, FALSE, {{1.0, 0.0, 1.0, 0.0, 0.0}}},
  88.    {0.1,   FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}}} */ ;
  89.  
  90. static BLEND_MAP Mandel_Default_Map =
  91.   { 5,  FALSE, COLOUR_TYPE,  -1,  Mandel_Entries};
  92.  
  93. static BLEND_MAP_ENTRY Agate_Entries[6] /* =
  94.   {{0.0, FALSE, {{1.0,  1.0,  1.0,  0.0, 0.0}}},
  95.    {0.5, FALSE, {{0.95, 0.75, 0.5,  0.0, 0.0}}},
  96.    {0.5, FALSE, {{0.9,  0.7,  0.5,  0.0, 0.0}}},
  97.    {0.6, FALSE, {{0.9,  0.7,  0.4,  0.0, 0.0}}},
  98.    {0.6, FALSE, {{1.0,  0.7,  0.4,  0.0, 0.0}}},
  99.    {1.0, FALSE, {{0.6,  0.3,  0.0,  0.0, 0.0}}}} */ ;
  100.  
  101. static BLEND_MAP Agate_Default_Map =
  102.   { 6,  FALSE, COLOUR_TYPE,  -1,  Agate_Entries};
  103.  
  104. static BLEND_MAP_ENTRY Radial_Entries[4] /* =
  105.   {{0.0,   FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}},
  106.    {0.333, FALSE, {{1.0, 1.0, 0.0, 0.0, 0.0}}},
  107.    {0.666, FALSE, {{1.0, 0.0, 1.0, 0.0, 0.0}}},
  108.    {1.0,   FALSE, {{0.0, 1.0, 1.0, 0.0, 0.0}}}} */ ;
  109.  
  110. static BLEND_MAP Radial_Default_Map =
  111.   { 4,  FALSE, COLOUR_TYPE,  -1,  Radial_Entries};
  112.  
  113. static BLEND_MAP_ENTRY Marble_Entries[3] /* =
  114.   {{0.0, FALSE, {{0.9, 0.8,  0.8,  0.0, 0.0}}},
  115.    {0.9, FALSE, {{0.9, 0.08, 0.08, 0.0, 0.0}}},
  116.    {0.9, FALSE, {{0.0, 0.0, 0.0, 0.0, 0.0}}}} */ ;
  117.  
  118. static BLEND_MAP Marble_Default_Map =
  119.   { 3,  FALSE, COLOUR_TYPE,  -1,  Marble_Entries};
  120.  
  121. static BLEND_MAP_ENTRY Brick_Entries[2] /* =
  122.   {{0.0, FALSE, {{0.5, 0.5,  0.5,  0.0, 0.0}}},
  123.    {1.0, FALSE, {{0.6, 0.15, 0.15, 0.0, 0.0}}}} */ ;
  124.  
  125. BLEND_MAP Brick_Default_Map =
  126.   { 2,  FALSE, COLOUR_TYPE,  -1,  Brick_Entries};
  127.  
  128. static BLEND_MAP_ENTRY Hex_Entries[3] /*=
  129.   {{0.0, FALSE, {{0.0, 0.0, 1.0, 0.0, 0.0}}},
  130.    {1.0, FALSE, {{0.0, 1.0, 0.0, 0.0, 0.0}}},
  131.    {2.0, FALSE, {{1.0, 0.0, 0.0, 0.0, 0.0}}}} */;
  132.  
  133. BLEND_MAP Hex_Default_Map =
  134.   { 3, FALSE,COLOUR_TYPE, -1, Hex_Entries};
  135.  
  136. BLEND_MAP Check_Default_Map =
  137.   { 2, FALSE,COLOUR_TYPE, -1, Hex_Entries}; /* Yes... Hex_Entries, not Check [CY] */
  138.  
  139.  
  140.  
  141. /*****************************************************************************
  142. * Static functions
  143. ******************************************************************************/
  144. static void Do_Average_Pigments PARAMS((COLOUR Colour, PIGMENT *Pigment, VECTOR EPoint));
  145.  
  146.  
  147.  
  148. /*****************************************************************************
  149. *
  150. * FUNCTION
  151. *
  152. *   Create_Pigment
  153. *
  154. * INPUT
  155. *   
  156. * OUTPUT
  157. *   
  158. * RETURNS
  159. *
  160. *   pointer to the created pigment
  161. *   
  162. * AUTHOR
  163. *
  164. *   POV-Ray Team
  165. *   
  166. * DESCRIPTION   : Allocate memory for new pigment and initialize it to
  167. *                 system default values.
  168. *
  169. * CHANGES
  170. *
  171. ******************************************************************************/
  172.  
  173. PIGMENT *Create_Pigment ()
  174. {
  175.   PIGMENT *New;
  176.  
  177.   New = (PIGMENT *)POV_MALLOC(sizeof (PIGMENT), "pigment");
  178.  
  179.   Init_TPat_Fields((TPATTERN *)New);
  180.  
  181.   Make_Colour(New->Colour, 0.0,0.0,0.0) ;
  182.  
  183.   New->Blend_Map = NULL;
  184.  
  185.   return (New);
  186. }
  187.  
  188.  
  189.  
  190. /*****************************************************************************
  191. *
  192. * FUNCTION
  193. *
  194. *   Copy_Pigment
  195. *
  196. * INPUT
  197. *
  198. *   Old -- point to pigment to be copied
  199. *   
  200. * RETURNS
  201. *
  202. *   pointer to the created pigment
  203. *   
  204. * AUTHOR
  205. *
  206. *   POV-Ray Team
  207. *   
  208. * DESCRIPTION   : Allocate memory for new pigment and initialize it to
  209. *                 values in existing pigment Old.
  210. *
  211. * CHANGES
  212. *
  213. ******************************************************************************/
  214.  
  215. PIGMENT *Copy_Pigment (Old)
  216. PIGMENT *Old;
  217. {
  218.   PIGMENT *New;
  219.  
  220.   if (Old != NULL)
  221.   {
  222.     New = Create_Pigment ();
  223.  
  224.     Copy_TPat_Fields ((TPATTERN *)New, (TPATTERN *)Old);
  225.  
  226.     if (Old->Type == PLAIN_PATTERN)
  227.     {
  228.       Assign_Colour(New->Colour,Old->Colour);
  229.     }
  230.   }
  231.   else
  232.   {
  233.     New = NULL;
  234.   }
  235.  
  236.   return (New);
  237. }
  238.  
  239.  
  240.  
  241. /*****************************************************************************
  242. *
  243. * FUNCTION
  244. *
  245. *   Destroy_Pigment
  246. *
  247. * INPUT
  248. *
  249. *   pointer to pigment to destroied
  250. *   
  251. * OUTPUT
  252. *   
  253. * RETURNS
  254. *   
  255. * AUTHOR
  256. *
  257. *   POV-Ray Team
  258. *   
  259. * DESCRIPTION   : free all memory associated with given pigment
  260. *
  261. * CHANGES
  262. *
  263. ******************************************************************************/
  264.  
  265. void Destroy_Pigment (Pigment)
  266. PIGMENT *Pigment;
  267. {
  268.   if (Pigment != NULL)
  269.   {
  270.     Destroy_Pigment((PIGMENT *)Pigment->Next);
  271.  
  272.     Destroy_TPat_Fields ((TPATTERN *)Pigment);
  273.  
  274.     POV_FREE(Pigment);
  275.   }
  276. }
  277.  
  278.  
  279.  
  280. /*****************************************************************************
  281. *
  282. * FUNCTION
  283. *
  284. *   Post_Pigment
  285. *
  286. * INPUT
  287. *   
  288. * OUTPUT
  289. *   
  290. * RETURNS
  291. *   
  292. * AUTHOR
  293. *
  294. *   Chris Young
  295. *   
  296. * DESCRIPTION
  297. *
  298. * CHANGES
  299. *
  300. ******************************************************************************/
  301.  
  302. int Post_Pigment(Pigment)
  303. PIGMENT *Pigment;
  304. {
  305.   int i, Has_Filter;
  306.   BLEND_MAP *Map;
  307.  
  308.   if (Pigment == NULL)
  309.   {
  310.     Error("Missing pigment");
  311.   }
  312.  
  313.   if (Pigment->Flags & POST_DONE)
  314.   {
  315.     return(Pigment->Flags & HAS_FILTER);
  316.   }
  317.  
  318.   if (Pigment->Type == NO_PATTERN)
  319.   {
  320.     Pigment->Type = PLAIN_PATTERN;
  321.  
  322.     Make_Colour(Pigment->Colour, 0.0, 0.0, 0.0) ;
  323.  
  324.     Warning(1.5, "No pigment type given.\n");
  325.   }
  326.  
  327.   Pigment->Flags |= POST_DONE;
  328.  
  329.   switch (Pigment->Type)
  330.   {
  331.     case PLAIN_PATTERN:
  332.  
  333.       Destroy_Warps (Pigment->Warps);
  334.  
  335.       Pigment->Warps = NULL;
  336.  
  337.       break;
  338.  
  339.     case NO_PATTERN:
  340.     case BITMAP_PATTERN:
  341.  
  342.       break;
  343.  
  344.     default:
  345.  
  346.       if (Pigment->Blend_Map == NULL)
  347.       {
  348.         switch (Pigment->Type)
  349.         {
  350.           case BOZO_PATTERN:    Pigment->Blend_Map = &Bozo_Default_Map;  break;
  351.           case BRICK_PATTERN:   Pigment->Blend_Map = &Brick_Default_Map; break;
  352.           case WOOD_PATTERN:    Pigment->Blend_Map = &Wood_Default_Map;  break;
  353.           case MANDEL_PATTERN:  Pigment->Blend_Map = &Mandel_Default_Map;break;
  354.           case RADIAL_PATTERN:  Pigment->Blend_Map = &Radial_Default_Map;break;
  355.           case AGATE_PATTERN:   Pigment->Blend_Map = &Agate_Default_Map; break;
  356.           case MARBLE_PATTERN:  Pigment->Blend_Map = &Marble_Default_Map;break;
  357.           case HEXAGON_PATTERN: Pigment->Blend_Map = &Hex_Default_Map;   break;
  358.           case CHECKER_PATTERN: Pigment->Blend_Map = &Check_Default_Map; break;
  359.           case AVERAGE_PATTERN: Error("Missing pigment_map in average pigment"); break;
  360.           default:              Pigment->Blend_Map = &Gray_Default_Map;  break;
  361.         }
  362.       }
  363.  
  364.       break;
  365.   }
  366.  
  367.   /* Now we test wether this pigment is opaque or not. [DB 8/94] */
  368.  
  369.   Has_Filter = FALSE;
  370.  
  371.   if ((fabs(Pigment->Colour[FILTER]) > EPSILON) ||
  372.       (fabs(Pigment->Colour[TRANSM]) > EPSILON))
  373.   {
  374.     Has_Filter = TRUE;
  375.   }
  376.  
  377.   if ((Map = Pigment->Blend_Map) != NULL)
  378.   {
  379.     if (Map->Type == PIGMENT_TYPE)
  380.     {
  381.        for (i = 0; i < Map->Number_Of_Entries; i++)
  382.        {
  383.          Has_Filter |= Post_Pigment(Map->Blend_Map_Entries[i].Vals.Pigment);
  384.        }
  385.     }
  386.     else
  387.     {
  388.        for (i = 0; i < Map->Number_Of_Entries; i++)
  389.        {
  390.          Has_Filter |= fabs(Map->Blend_Map_Entries[i].Vals.Colour[FILTER])>EPSILON;
  391.          Has_Filter |= fabs(Map->Blend_Map_Entries[i].Vals.Colour[TRANSM])>EPSILON;
  392.        }
  393.     }
  394.   }
  395.  
  396.   if (Has_Filter)
  397.   {
  398.     Pigment->Flags |= HAS_FILTER;
  399.   }
  400.  
  401.   return(Has_Filter);
  402. }
  403.  
  404.  
  405.  
  406. /*****************************************************************************
  407. *
  408. * FUNCTION
  409. *
  410. *   Compute_Pigment
  411. *
  412. * INPUT
  413. *
  414. *   Pigment - Info about this pigment
  415. *   EPoint  - 3-D point at which pattern is evaluated
  416. *
  417. * OUTPUT
  418. *
  419. *   Colour  - Resulting color is returned here.
  420. *
  421. * RETURNS
  422. *
  423. *   int - TRUE,  if a color was found for the given point
  424. *         FALSE, if no color was found (e.g. areas outside an image map
  425. *                that has the once option)
  426. *
  427. * AUTHOR
  428. *
  429. *   POV-Ray Team
  430. *
  431. * DESCRIPTION
  432. *   Given a 3d point and a pigment, compute colour from that layer.
  433. *   (Formerly called "Colour_At", or "Add_Pigment")
  434. *
  435. * CHANGES
  436. *   Added pigment map support [CY 11/94]
  437. *
  438. ******************************************************************************/
  439.  
  440. int Compute_Pigment (Colour, Pigment, EPoint)
  441. COLOUR Colour;
  442. PIGMENT *Pigment;
  443. VECTOR EPoint;
  444. {
  445.   int Colour_Found;
  446.   VECTOR TPoint;
  447.   DBL value;
  448.   register DBL fraction;
  449.   BLEND_MAP_ENTRY *Cur, *Prev;
  450.   COLOUR Temp_Colour;
  451.   BLEND_MAP *Blend_Map = Pigment->Blend_Map;
  452.  
  453.   if (Pigment->Type <= LAST_SPECIAL_PATTERN)
  454.   {
  455.     Colour_Found = TRUE;
  456.  
  457.     switch (Pigment->Type)
  458.     {
  459.       case NO_PATTERN:
  460.  
  461.         Make_Colour(Colour, 0.0, 0.0, 0.0);
  462.  
  463.         break;
  464.  
  465.       case PLAIN_PATTERN:
  466.  
  467.         Assign_Colour(Colour,Pigment->Colour);
  468.  
  469.         break;
  470.  
  471.       case AVERAGE_PATTERN:
  472.  
  473.         Warp_EPoint (TPoint, EPoint, (TPATTERN *)Pigment);
  474.  
  475.         Do_Average_Pigments(Colour,Pigment,TPoint);
  476.  
  477.         break;
  478.  
  479.       case BITMAP_PATTERN:
  480.  
  481.         Warp_EPoint (TPoint, EPoint, (TPATTERN *)Pigment);
  482.  
  483.         Make_Colour(Colour, 0.0, 0.0, 0.0);
  484.  
  485.         Colour_Found = image_map (TPoint, Pigment, Colour);
  486.  
  487.         break;
  488.  
  489.       default:
  490.  
  491.         Error("Pigment type %d not yet implemented",Pigment->Type);
  492.     }
  493.  
  494.     return(Colour_Found);
  495.   }
  496.  
  497.   Colour_Found = FALSE;
  498.  
  499.   value = Evaluate_TPat ((TPATTERN *)Pigment,EPoint);
  500.  
  501.   Search_Blend_Map (value, Blend_Map, &Prev, &Cur);
  502.  
  503.   if (Blend_Map->Type == COLOUR_TYPE)
  504.   {
  505.     Colour_Found = TRUE;
  506.  
  507.     Assign_Colour(Colour, Cur->Vals.Colour);
  508.   }
  509.   else
  510.   {
  511.     Warp_EPoint (TPoint, EPoint, (TPATTERN *)Pigment);
  512.  
  513.     if (Compute_Pigment(Colour, Cur->Vals.Pigment,TPoint))
  514.     {
  515.       Colour_Found = TRUE;
  516.     }
  517.   }
  518.  
  519.   if (Prev != Cur)
  520.   {
  521.     if (Blend_Map->Type == COLOUR_TYPE)
  522.     {
  523.       Colour_Found = TRUE;
  524.  
  525.       Assign_Colour(Temp_Colour, Prev->Vals.Colour);
  526.     }
  527.     else
  528.     {
  529.       if (Compute_Pigment(Temp_Colour, Prev->Vals.Pigment, TPoint))
  530.       {
  531.         Colour_Found = TRUE;
  532.       }
  533.     }
  534.  
  535.     fraction = (value - Prev->value) / (Cur->value - Prev->value);
  536.  
  537.     Colour[RED]    = Temp_Colour[RED]    + fraction * (Colour[RED]    - Temp_Colour[RED]);
  538.     Colour[GREEN]  = Temp_Colour[GREEN]  + fraction * (Colour[GREEN]  - Temp_Colour[GREEN]);
  539.     Colour[BLUE]   = Temp_Colour[BLUE]   + fraction * (Colour[BLUE]   - Temp_Colour[BLUE]);
  540.     Colour[FILTER] = Temp_Colour[FILTER] + fraction * (Colour[FILTER] - Temp_Colour[FILTER]);
  541.     Colour[TRANSM] = Temp_Colour[TRANSM] + fraction * (Colour[TRANSM] - Temp_Colour[TRANSM]);
  542.   }
  543.  
  544.   return(Colour_Found);
  545. }
  546.  
  547.  
  548.  
  549. /*****************************************************************************
  550. *
  551. * FUNCTION
  552. *
  553. * INPUT
  554. *
  555. * OUTPUT
  556. *   
  557. * RETURNS
  558. *   
  559. * AUTHOR
  560. *   
  561. * DESCRIPTION
  562. *
  563. * CHANGES
  564. *
  565. ******************************************************************************/
  566.  
  567. static void Do_Average_Pigments (Colour, Pigment, EPoint)
  568. COLOUR Colour;
  569. PIGMENT *Pigment;
  570. VECTOR EPoint;
  571. {
  572.    int i;
  573.    COLOUR LC;
  574.    BLEND_MAP *Map = Pigment->Blend_Map;
  575.    SNGL Value;
  576.    SNGL Total = 0.0;
  577.    DBL rdiv;
  578.       
  579.    Make_Colour (Colour, 0.0, 0.0, 0.0);
  580.  
  581.    for (i = 0; i < Map->Number_Of_Entries; i++)
  582.    {
  583.      Value = Map->Blend_Map_Entries[i].value;
  584.  
  585.      Compute_Pigment (LC,Map->Blend_Map_Entries[i].Vals.Pigment,EPoint);
  586.      
  587.      Colour[RED]   += LC[RED]   *Value;
  588.      Colour[GREEN] += LC[GREEN] *Value;
  589.      Colour[BLUE]  += LC[BLUE]  *Value;
  590.      Colour[FILTER]+= LC[FILTER]*Value;
  591.      Colour[TRANSM]+= LC[TRANSM]*Value;
  592.  
  593.      Total += Value;
  594.    }
  595.  
  596.    rdiv = (1.0 / Total);
  597.    Colour[RED]   *= rdiv;
  598.    Colour[GREEN] *= rdiv;
  599.    Colour[BLUE]  *= rdiv;
  600.    Colour[FILTER]*= rdiv;
  601.    Colour[TRANSM]*= rdiv;
  602. /*
  603.    Colour[RED]   /= Total;
  604.    Colour[GREEN] /= Total;
  605.    Colour[BLUE]  /= Total;
  606.    Colour[FILTER]/= Total;
  607.    Colour[TRANSM]/= Total;
  608. */
  609. }
  610.  
  611.  
  612.  
  613. /*****************************************************************************
  614. *
  615. * FUNCTION  Make_Pigment_Entries
  616. *
  617. * INPUT  None
  618. *   
  619. * OUTPUT  Initializes default pigment blend_map values.
  620. *   
  621. * RETURNS  None
  622. *   
  623. * AUTHOR  Steve Demlow, Dec. '95
  624. *   
  625. * DESCRIPTION  Some pre-ANSI compilers won't auto-initialize unions, so these
  626. *   have to be done in regular code.
  627. *
  628. * CHANGES
  629. *
  630. ******************************************************************************/
  631.  
  632. void Make_Pigment_Entries()
  633. {
  634.   static unsigned char Made = FALSE;
  635.  
  636.   if (Made) {
  637.     return;
  638.   }
  639.   Made = TRUE;
  640.  
  641.   Make_Blend_Map_Entry(Black_White_Entries[0] , 0.0, FALSE, 0.0, 0.0, 0.0, 0.0, 0.0);
  642.   Make_Blend_Map_Entry(Black_White_Entries[1] , 1.0, FALSE, 1.0, 1.0, 1.0, 0.0, 0.0);
  643.   
  644.   Make_Blend_Map_Entry(Bozo_Entries[0], 0.4, FALSE, 1.0, 1.0, 1.0, 0.0, 0.0);
  645.   Make_Blend_Map_Entry(Bozo_Entries[1], 0.4, FALSE, 0.0, 1.0, 0.0, 0.0, 0.0);
  646.   Make_Blend_Map_Entry(Bozo_Entries[2], 0.6, FALSE, 0.0, 1.0, 0.0, 0.0, 0.0);
  647.   Make_Blend_Map_Entry(Bozo_Entries[3], 0.6, FALSE, 0.0, 0.0, 1.0, 0.0, 0.0);
  648.   Make_Blend_Map_Entry(Bozo_Entries[4], 0.8, FALSE, 0.0, 0.0, 1.0, 0.0, 0.0);
  649.   Make_Blend_Map_Entry(Bozo_Entries[5], 0.8, FALSE, 1.0, 0.0, 0.0, 0.0, 0.0);
  650.   
  651.   Make_Blend_Map_Entry(Wood_Entries[0], 0.6, FALSE, 0.666, 0.312,  0.2,   0.0, 0.0);
  652.   Make_Blend_Map_Entry(Wood_Entries[1], 0.6, FALSE, 0.4,   0.1333, 0.066, 0.0, 0.0);
  653.   
  654.   Make_Blend_Map_Entry(Mandel_Entries[0], 0.001, FALSE, 0.0, 0.0, 0.0, 0.0, 0.0);
  655.   Make_Blend_Map_Entry(Mandel_Entries[1], 0.001, FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  656.   Make_Blend_Map_Entry(Mandel_Entries[2], 0.012, FALSE, 1.0, 1.0, 0.0, 0.0, 0.0);
  657.   Make_Blend_Map_Entry(Mandel_Entries[3], 0.015, FALSE, 1.0, 0.0, 1.0, 0.0, 0.0);
  658.   Make_Blend_Map_Entry(Mandel_Entries[4], 0.1,   FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  659.   
  660.   Make_Blend_Map_Entry(Agate_Entries[0], 0.0, FALSE, 1.0,  1.0,  1.0,  0.0, 0.0);
  661.   Make_Blend_Map_Entry(Agate_Entries[1], 0.5, FALSE, 0.95, 0.75, 0.5,  0.0, 0.0);
  662.   Make_Blend_Map_Entry(Agate_Entries[2], 0.5, FALSE, 0.9,  0.7,  0.5,  0.0, 0.0);
  663.   Make_Blend_Map_Entry(Agate_Entries[3], 0.6, FALSE, 0.9,  0.7,  0.4,  0.0, 0.0);
  664.   Make_Blend_Map_Entry(Agate_Entries[4], 0.6, FALSE, 1.0,  0.7,  0.4,  0.0, 0.0);
  665.   Make_Blend_Map_Entry(Agate_Entries[5], 1.0, FALSE, 0.6,  0.3,  0.0,  0.0, 0.0);
  666.   
  667.   Make_Blend_Map_Entry(Radial_Entries[0], 0.0,   FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  668.   Make_Blend_Map_Entry(Radial_Entries[1], 0.333, FALSE, 1.0, 1.0, 0.0, 0.0, 0.0);
  669.   Make_Blend_Map_Entry(Radial_Entries[2], 0.666, FALSE, 1.0, 0.0, 1.0, 0.0, 0.0);
  670.   Make_Blend_Map_Entry(Radial_Entries[3], 1.0,   FALSE, 0.0, 1.0, 1.0, 0.0, 0.0);
  671.   
  672.   Make_Blend_Map_Entry(Marble_Entries[0], 0.0, FALSE, 0.9, 0.8, 0.8, 0.0, 0.0);
  673.   Make_Blend_Map_Entry(Marble_Entries[1], 0.9, FALSE, 0.9, 0.08, 0.08, 0.0, 0.0);
  674.   Make_Blend_Map_Entry(Marble_Entries[2], 0.9, FALSE, 0.0, 0.0, 0.0, 0.0, 0.0);
  675.   
  676.   Make_Blend_Map_Entry(Brick_Entries[0], 0.0, FALSE, 0.5, 0.5,  0.5,  0.0, 0.0);
  677.   Make_Blend_Map_Entry(Brick_Entries[1], 1.0, FALSE, 0.6, 0.15, 0.15, 0.0, 0.0);
  678.   
  679.   Make_Blend_Map_Entry(Hex_Entries[0], 0.0, FALSE, 0.0, 0.0, 1.0, 0.0, 0.0);
  680.   Make_Blend_Map_Entry(Hex_Entries[1], 1.0, FALSE, 0.0, 1.0, 0.0, 0.0, 0.0);
  681.   Make_Blend_Map_Entry(Hex_Entries[2], 2.0, FALSE, 1.0, 0.0, 0.0, 0.0, 0.0);
  682. }
  683.  
  684.  
  685.  
  686.